package top.huahaizhi.mpchart.demo;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/*
  ↑ y轴
  |
  |
  |
  |————————————————————————————————————————（假装这是一个折线{我不会用文字画出折线来……}，LineDataSet，如果有多个折线，就要定义多个LineDataSet变量和entries集合，一个LineDataSet对应一个entries集合）
  |
  |
  |
  |----------------------------------------> x轴
  0     1     2     3     4     5     6     7  ——>(xValues)

 */

/**
 * 联系：
 *
 * huahaizhi@gmail.com
 * 841019329
 * 18501171774
 *
 */
public class LineChartActivity extends AppCompatActivity {

    //折线图View
    private LineChart lineChart;

    //横轴的值
    private List<String> xValues;
    private List<Entry> entries;

    //折线图点的颜色
    private List<Integer> circleColors;
    //折线图线的颜色，线的颜色集合的size应该比circleColors的size小1，因为如果是n(n>1)个点，用n-1条线就可以连接。
    private List<Integer> lineColors;

    private LineDataSet lineDataSet;
    private LineData lineData;

    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            //操作View需要在主线程中执行。
            lineChart.postInvalidate();
            return false;
        }
    });

    private boolean isActivityAlive = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_line_chart);

        lineChart = (LineChart) findViewById(R.id.lineChart);

        //初始化数据
        xValues = new ArrayList<>();
        entries = new ArrayList<>();
        circleColors = new ArrayList<>();
        lineColors = new ArrayList<>();

        lineDataSet = new LineDataSet(entries, "横轴标签");
        lineData = new LineData(xValues, lineDataSet);

        lineChart.setData(lineData);

//        lineData.addDataSet();   如果有多条折线，调用此方法可以添加一条折线。

        new Thread() {
            @Override
            public void run() {
                while (isActivityAlive) {
                    try {
                        addData(new Random().nextInt(100));
                        handler.sendEmptyMessage(0x001);
                        sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    private void addData(int num) {
        if(xValues.size() < 10)
            xValues.add("第" + (xValues.size() + 1) + "个数字");
        entries.add(new Entry(num, 0));
        //                     ↑   ↑
        //                   y坐标 x坐标（暂时先设置为0）

        if(num>50) {
            circleColors.add(Color.RED);
            lineColors.add(Color.RED);
        }else{
            circleColors.add(Color.GREEN);
            lineColors.add(Color.GREEN);
        }

        if(entries.size()>10){
            entries.remove(0);
            circleColors.remove(0);
        }
        if(lineColors.size()>9)
            lineColors.remove(0);

        for(int i = 0; i < entries.size(); i++) {
            Entry item = entries.get(i);
            item.setXIndex(i);
            entries.set(i, item);
        }

        //                ☆☆☆☆☆  注意！！！！  ☆☆☆☆☆
        //不能给lineDataSet设置一个size为0的colors集合！！！！！

        //下面的几行代码表示了这个意思，所以加了两行if语句的判断，当然，这里的集合的size无论如何都不会是0，在第110行的for循环语句中已经为这两个list集合添加了数据。
        if(circleColors.size()>0)
            lineDataSet.setCircleColors(circleColors);
        if(lineColors.size()>0)
            lineDataSet.setColors(lineColors);

        lineDataSet.notifyDataSetChanged();
        lineData.notifyDataChanged();
        lineChart.notifyDataSetChanged();
        //也可以lineChart.setData(lineData);，但是这么做有时候会出错，所以不建议这么做。
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        isActivityAlive= false;
    }
}